package jacky.lanlan.song.extension.struts.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * <p>
 * Specifies a local forward. Equivalent to adding a <em>forward</em>
 * mapping within an <em>action</em> mapping in
 * <code>struts-config.xml</code>.
 * </p>
 * 
 * <p>
 * It is possible to define multiple forwards by providing parameters as
 * arrays.
 * </p>
 * @author Jacky.Song
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Forward {
	/**
   * Forward name. Corresponds to <em>name</em> property.
   */
	String[] name();

	/**
   * Whether this forward is a redirect. Corresponds to <em>redirect</em>
   * property.Default is false.
   */
	boolean[] redirect() default {};

	/**
   * Forward path. Corresponds to <em>path</em> property.
   * <p/>
   * Spring式的输入风格：如果以<code>"invoke:"</code>开头，则后面可以指定Action的方法，
   * 这个path将根据映射规则自动转换为可以调用该方法的URL。
   * <p/>
   * 例子：比如有FooAction：<code><pre>
   * package aaa.bbb.action.ccc;
   * FooAction{
   * 	 public ... bar(...){...} // bar方法
   * }
   * </pre></code>
   * 如果想要forward到bar方法调用，可以写<code>path="invoke:FooAction.bar"</code>，这个path
   * 将根据映射规则自动转换为可以调用该方法的URL(如果是默认映射，则URL是<code>ccc/Foo!bar.do</code>)。<br/>
   * <b style="color:red">
   * 如果有两个Action有相同的名称，则被调用的Action是<i>不可预测的</i>，所以，为避免这种情况，不要使用同名Action!
   * </b>
   */
	String[] path();
	
	/**
	 * 成功页面的Forward名称
	 */
	public static final String SUCCESS="success";

	/**
	 * 失败页面的Forward名称
	 */
	public static final String FAILURE="failure";
	
	/**
	 * 输入页面的Forward名称
	 */
	public static final String INPUT="input";
	
}